﻿#include<iostream>
using namespace std;

struct Role {
	int hp;
	int mp;
};
Role CreateMonster() {
	Role rt{ 100,200 };
	return rt;
}
void Show(Role&& rl) {//不用新创建结构体保存传进来的数据，直接右值引用
	cout << rl.hp << endl;
}

void Add(int& a) {//引用一定要接受明确的内存空间
	cout << a << endl;
}
void Add(int&& a) {
	cout << a << endl;
}

int main() {
	int c = 32 + 234;//左值赋值，左值是指有内存空间存放，右值是指没有具体内存空间存放，也就是临时存放
	int& d = c;
	int&& e = 234;//&&代表右值引用，并不是引用的引用

	cout << e << endl;
	e = 123;
	cout << e << endl;

	int a[10];
	*(a + 1) = 100;//a+1是个临时计算的值，也就是右值，所以等号左边并不一定是左值

	int x = c + 234;
	Add(x);//对于Add(int& a)，先分配内存空间保存，再传进来，这样会造成一次性能浪费

	Add(32 + 234);//对于Add(int&& a)，直接右值引用，没有多一次性能浪费

	Show(CreateMonster());

	cout << &(a++) << endl;//报错，a++返回右值，因为a++先自增再返回原来的临时对象
	cout << &(++a) << endl;//正常，++a返回左值，因为++a先自增再返回现在的对象
	cout << &(5 + a) << endl;//报错，5+a返回右值
}